const axios = require('axios');
const dotenv = require('dotenv');
const path = require('path');

// 尝试从项目根目录加载 .env 文件
const envPath = path.resolve(process.cwd(), '.env');
console.log('尝试从以下路径加载 .env 文件:', envPath);
dotenv.config({ path: envPath });

// 确认环境变量是否加载
console.log('ALIBABA_QWEN_API_KEY 是否已设置:', !!process.env.ALIBABA_QWEN_API_KEY);

/**
 * 阿里云通义千问 AI 模型服务
 * 提供与通义千问 Qwen-Long 模型的交互功能
 */
class AiModelService {
  /**
   * 使用通义千问 Qwen-Long 模型解析文本内容
   * @param {string} content - 需要解析的文本内容
   * @param {object} options - 解析选项
   * @returns {Promise<object>} - 解析结果
   */
  static async parseWithQwenLong(content, options = {}) {
    try {
      // 获取环境变量中的 API 密钥
      const apiKey = process.env.ALIBABA_QWEN_API_KEY;
      
      console.log('API 密钥状态:', apiKey ? '已设置' : '未设置');
      
      if (!apiKey) {
        throw new Error('未设置 ALIBABA_QWEN_API_KEY 环境变量');
      }
      
      // 准备请求数据
      const task = options.task || 'extract_structure';
      
      // 根据任务类型设置不同的提示词
      let systemPrompt = '';
      let userPrompt = '';
      
      if (task === 'extract_structure') {
        systemPrompt = '你是一个专业的文档结构分析器。你的任务是分析文档内容，提取其章节结构。';
        userPrompt = `请分析以下文档内容，提取出文档的章节结构，包括章节标题、开始位置和结束位置。返回格式为JSON数组，每个元素包含title、startIndex和endIndex字段。不要返回HTML或Markdown格式，只返回纯文本JSON。

示例输出格式：
[
  {
    "title": "章节标题1",
    "startIndex": 0,
    "endIndex": 100
  },
  {
    "title": "章节标题2",
    "startIndex": 101,
    "endIndex": 200
  }
]

文档内容：
${content}`;
      } else if (task === 'generate_cards') {
        systemPrompt = '你是一个知识卡片生成专家。你的任务是从文本内容中提取关键知识点，生成简洁、有用的知识卡片。';
        
        // 使用自定义提示词（如果提供）或默认提示词
        if (options.customPrompt) {
          userPrompt = `${options.customPrompt}

内容：
${content}`;
        } else {
          userPrompt = `请分析以下内容，提取关键知识点，生成知识卡片。每张卡片应包含标题、内容和相关标签。返回格式为JSON数组。不要返回HTML或Markdown格式，只返回纯文本JSON。

示例输出格式：
[
  {
    "title": "卡片标题1",
    "content": "卡片内容1",
    "tags": ["标签1", "标签2"]
  },
  {
    "title": "卡片标题2",
    "content": "卡片内容2",
    "tags": ["标签3", "标签4"]
  }
]

内容：
${content}`;
        }
      } else if (task === 'summarize') {
        systemPrompt = '你是一个专业的文档摘要专家。你的任务是提取文档的主要观点和关键信息。';
        userPrompt = `请对以下文档内容进行摘要，提取主要观点和关键信息。
摘要应简明扼要，不超过200字。
请直接返回摘要文本，不要返回HTML格式或其他标记语言。
不要使用任何HTML标签，只返回纯文本。

文档内容：
${content}`;
      } else {
        throw new Error(`不支持的任务类型: ${task}`);
      }
      
      // 设置请求参数
      const requestData = {
        model: 'qwen-long',
        input: {
          messages: [
            {
              role: 'system',
              content: systemPrompt
            },
            {
              role: 'user',
              content: userPrompt
            }
          ]
        },
        parameters: {
          temperature: options.temperature || 0.2,
          top_p: options.top_p || 0.8,
          max_tokens: options.max_tokens || 1000,
          result_format: 'text', // 明确要求返回纯文本格式
          response_format: { type: 'text' } // 明确要求返回纯文本格式
        }
      };
      
      // 发送请求
      console.log('发送请求到通义千问 API...');
      const response = await axios.post(
        'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation',
        requestData,
        {
          headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${apiKey}`
          },
          timeout: 100000 // 设置100秒超时时间
        }
      );
      
      console.log('收到通义千问 API 响应，状态码:', response.status);
      
      // 处理响应
      if (response.data && response.data.output && response.data.output.choices && response.data.output.choices.length > 0) {
        const result = response.data.output.choices[0].message.content;
        
        // 检查是否为HTML格式的响应
        if (result.includes('<html') || result.includes('<!DOCTYPE') || result.includes('<body')) {
          console.log('检测到HTML格式的响应，尝试提取纯文本...');
          
          // 移除HTML标签，提取纯文本
          const plainText = result.replace(/<[^>]*>/g, '');
          
          return {
            success: true,
            result: plainText,
            originalResponse: result
          };
        }
        
        return {
          success: true,
          result: result
        };
      } else {
        console.error('通义千问 API 返回了无效的响应格式:', JSON.stringify(response.data, null, 2));
        return {
          success: false,
          error: '无效的 API 响应格式'
        };
      }
    } catch (error) {
      console.error('通义千问 API 请求失败:', error.message);
      
      // 更详细的错误日志记录
      if (error.code === 'ECONNABORTED') {
        console.error('通义千问 API 请求超时');
        return {
          success: false,
          error: '请求超时，AI模型处理时间过长'
        };
      }
      
      if (error.response) {
        console.error('错误状态码:', error.response.status);
        console.error('错误详情:', JSON.stringify(error.response.data, null, 2));
        return {
          success: false,
          error: `API错误(${error.response.status}): ${error.response.data.message || error.message}`
        };
      }
      
      if (error.request) {
        console.error('请求已发送但没有收到响应');
        return {
          success: false,
          error: '网络连接错误，无法连接到AI服务'
        };
      }
      
      return {
        success: false,
        error: error.message
      };
    }
  }
}

module.exports = AiModelService; 